# 异常处理

# func()! 语法错误

# 异常
# ZeroDivisionError 除零异常
# print(10 / 0)

# NameError 访问一个没有定义的变量
# print(name)

# TypeError 对某个类型进行不恰当的操作
str1 = "123"
int1 = 456
# print(str1 + int1)

# ValueError
str2 = "abc"
# print(int(str2))


list1 = [1, 2, 3, 4]
# IndexError
# print(list1[4])

# AttributeError
# list1.items()


# 捕获异常
"""
try:
    可能会发生异常的代码
except 捕获可能会发生的异常:
    针对捕获到的异常进行处理
else:
    没有发生异常就会执行
finally:
    不管有没有发生异常都会执行
"""
# print(10 / 0)
try:
    # list1.items()
    # 一单前面的代码发生了异常，会立即跳出try
    # 后面的代码不会执行
    print("没有问题")
# 如果不知道代码会发生什么异常
# 可以使用Exception表示任意异常
except Exception:
    print("捕获到了异常")
else:
    print("没有捕获到任何异常才会执行")
finally:
    print("不管有没有发生异常都会执行")

print("helloWorld")


# 判断age是否小于零 小于零就抛出异常
# 自定义异常
# 主动抛出异常：raise
class MyAgeException(Exception):
    print("自定义异常")


try:
    age = -1
    if age < 0:
        # 只要抛出了异常 会立即跳出try代码块 进入except
        raise MyAgeException
    print(age)
# 按照顺序，一个一个except进行匹配
# 直到匹配上
# 如果都没有匹配上，那么程序将会中端
except ZeroDivisionError:
    pass
except ValueError:
    pass
except MyAgeException:
    print("捕获到了自定义异常")
